想必大家在做 CTF 時都有遇過「執行程式不知道為什麼不輸出 flag」的情況吧?
這時候最有效的工具之一就是 —— gdb
gdb
是 GNU 的除錯器(GNU Debugger),可以用來啟動/暫停程式、設斷點、單步執行、檢視/修改寄存器與記憶體、快照 stack 與 heap 等。gdb ./a.out
啟動 GDB 並載入執行檔start
從 main 開始執行(會停在 main 的第一行)run
或 r
執行程式(不保證停在 main)quit
或 q
離開 GDBb main
在 main 函式入口下斷點b *0x4010a4
在指定位址下斷點(如 main+42)info breakpoints
查看目前斷點狀態delete
刪除所有斷點(或加號碼如 delete 1)disable
/ enable
關閉 / 啟用某個斷點c
或 continue
繼續執行直到下個斷點或程式結束s
或 step
單步執行,會進入函式n
或 next
單步執行,不會進入函式finish
執行到目前函式 returnjump *0x401234
強制跳到指定位址info registers
顯示所有暫存器的值(rax, rsp, rip…)p $eax
/ p $rax
印出指定暫存器的值x/s $rax
把暫存器指到的位址當作字串印出x/4x $rsp
查看記憶體內容(16 進位)x/4gx $rbp-0x30
查看 4 個 64-bit 的值x/i $rip
反組譯目前指令(Instruction)disassemble main
查看 main 函式的組語info functions
顯示所有可以 call 的函式(沒 debug symbol 時很有用)list
顯示原始碼(若有加 -g 編譯)backtrace
或 bt
呼叫堆疊(呼叫順序)context
顯示當前執行狀態(暫存器、堆疊、程式碼)telescope $rsp
像望遠鏡一樣看堆疊內容set $eax=0x1337
手動修改暫存器數值(很適合繞過邏輯)set {int}0x404040 = 0x1234
修改記憶體中的值layout asm
切換到組合語言視圖模式這題要用gdb打開,記得先幫檔案加執行權限ㄛㄛ
我自己習慣用layout asm
開視圖模式 因為我菜
這題要看的是main函式,所以先在main下個斷點 → b main
run後可以看到他停在main
因為他問的是最後的eax值,所以我們可以直接下滑到最後找到<main+60>
的位子會回傳值,所以在這邊也下一個斷點 → b *0x401142
然後打c,他會跳到當前的下一個斷點處,也就是<main+60>
那個位子
打print $eax
就能得到eax的值了
以上就是今天的內容啦
想看更多,記得明天再來喔~